/*
 * BZPModel.h
 *
 *  Created on: 24/05/2014
 *      Author: javier
 */

#ifndef BZPMODEL_H_
#define BZPMODEL_H_

#include <map>
#include "Positionable.h"
#include "Properties.h"

enum EventToValidate{
	MOVE_UP, MOVE_LEFT, MOVE_RIGHT, MOVE_DOWN
};

/*
 * Representa al modelo del servidor, guardando los datos de posicion y tipo
 * de objeto, sin comportamiento.
 */
class BZPModel {
public:
	BZPModel();
	Positionable* add(Positionable *p);
	// elimina un objeto del modelo
	void remove(int id);
	// actualiza la posicion del objeto en el modelo
	void update(int id, double x, double y);
	std::pair<int, int> query(int id);
	void clear();
	// Define el ID del bomberman del jugador
	void setIDTarget(int id);
	Positionable* getTarget();
	int getIDTarget();
	void setDimensions(int x, int y);
	/*
	 * Valida que el movimiento que intenta hacer el jugador se valido en lo inmediato
	 * usando la representacion local del modelo del server.
	 */
	bool validate(EventToValidate event);
	Positionable* getObject(int id);
	virtual ~BZPModel();
private:
	double absoluteValue(double val);
	double distance(double xObject, double yObject, double xPos, double yPos);
	std::map<int, Positionable*> objects;
	std::map<int, Positionable*> solids;
	int idPlayer;
	int width, height;
	Properties properties;
};

#endif /* BZPMODEL_H_ */
